[1] 5
[1] 6
[1] 15
[1] 5
Crear código en R, uso colaborativo y reproducible
¿Quiénes somos?
Lunes = introducción a R, crear código, buenas prácticas
Martes = manejo y visualizacion de datos
Miércoles = modelos lineales y factoriales
Jueves = modelos generalizados y multivariantes
Viernes = uso colaborativo, dudas, ejemplos
Mejorar la comprensión y la práctica estadística.
Desarrollar habilidades en programación en R.
Aprender flujos de trabajo eficientes, limpios y reproducibles.
Saber buscar información
No enredarse en errores
A programar en plan pro sin mirar internet o chatgpt
A hacer páginas web
A dejar de pelearte con la estadística
WordCloud
R es un lenguaje y entorno de programación especializado en:
Análisis estadístico, visualización de datos y ciencia de datos.
Utilizado por investigadores, analistas y científicos para explorar, modelar y comunicar información basada en datos de forma eficiente y reproducible.
Muy utilizado en biología
Biólogxs en general
R → Es el lenguaje de programación y el motor que realiza los cálculos estadísticos y el análisis de datos.
RStudio → Es un entorno de desarrollo integrado (un programa) que facilita el uso de R con una interfaz amigable, paneles, autocompletado y herramientas visuales.
Ejemplo mesa de trabajo
Es una calculadora: se pueden hacer operaciones básicas multiplicar, dividir, sumar, restar…
Las operaciones lógicas comparan valores y devuelven un resultado lógico.
TRUE se comporta como 1 y FALSE como 0. Se pueden sumar o usar en cálculos.
[1] FALSE
[1] FALSE
[1] TRUE
[1] 3
[1] 0.75
Cuidado que en R “=” y “<-” son sinónimos!
La magia de los objetos
Los objetos empiezan por una letra
Son sensibles a mayusculas
Tienen que llevar nombres coherentes y un orden
Hay muuchos tipos de objetos
[1] 1 2 3 4 5 6 7 8 9 10
[1] "del uno al diez"
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1] 11 12 13 14 15 16 17 18 19 20
[[3]]
[1] 21 22 23 24 25 26 27 28 29 30
Podemos transformar objetos de un tipo en otro con as.xxxx()
Creamos vectores, que son elementos del mismo tipo juntos (numérico, carácter). Es un poco como una fila de una tabla… se pueden crear con 1:10 (numeros del 1 al 10)
Consecutivos del 1:10
Combinando c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Generador de secuencias: del 0 al 100 cada 10 seq(0, 100, 10)
[1] 1 2 3 4 5
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
[1] 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
[26] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
[1] 3
[1] 3 6 9 12 15
[1] 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 0.16666667
[7] 0.28571429 0.37500000 0.44444444 0.50000000 0.09090909 0.16666667
[13] 0.23076923 0.28571429 0.33333333 0.06250000 0.11764706 0.16666667
[19] 0.21052632 0.25000000 0.04761905 0.09090909 0.13043478 0.16666667
[25] 0.20000000 0.03846154 0.07407407 0.10714286 0.13793103 0.16666667
[31] 0.03225806 0.06250000 0.09090909 0.11764706 0.14285714 0.02777778
[37] 0.05405405 0.07894737 0.10256410 0.12500000
[1] 0.375
R es muy potente generando distribuciones.
Una distribución describe cómo se reparten los valores de una variable.
Números al azar → todos con la misma probabilidad UNIFORME ### Ejemplo Distribución uniforme
[1] 0.30386252 0.05295652 0.59232550 0.82649434 0.46938448
[1] 92.80687 74.29579 90.39731
Alturas de personas → muchas alrededor del promedio (forma de campana) NORMAL
[1] 1.1308427 -0.2555750 -0.4187162 0.0651027
Conteo POISSON
# Generar 1000 observaciones con media (λ) = 3
x <- rpois(1000, lambda = 3)
# Ver las primeras observaciones
head(x)[1] 4 4 4 0 1 2
Resultados de “éxito o fracaso” (como lanzar una moneda) BINOMIAL
# Binomial
# 20 experimentos, en cada uno lanzamos una monedas, con una probabilidad de que salga cara del 50%
caras <- rbinom(200, size = 1, prob = 0.5)
table(caras)caras
0 1
105 95
Las funciones son aplicaciones que nos permiten realizar operaciones muy diversas.
[1] 7.714286
[1] 8
[1] 3.59232
[1] 3
[1] 12
[1] 3 12
Min. 1st Qu. Median Mean 3rd Qu. Max.
3.000 5.000 8.000 7.714 10.500 12.000
Ayuda para funciones en R (o también vale buscar en google “function mean in R”)
Aleatoriedad
[1] 3 7 11 5 6 5 9 8
[1] 9 6 5
[1] 8 9 5 6 5 11 7 3
[1] 3 5 5 6 7 8 9 11
Conteos y valores únicos
Nombres y texto
[1] "Laura" "Rocio" "Violeta"
nombres
Laura Rocio Violeta
1 3 1
[1] "Laura" "Rocio" "Violeta" "Rocio" "Rocio" "Laura" "Rocio"
[8] "Violeta" "Rocio" "Rocio" "Laura" "Rocio" "Violeta" "Rocio"
[15] "Rocio" "Laura" "Rocio" "Violeta" "Rocio" "Rocio" "Laura"
[22] "Rocio" "Violeta" "Rocio" "Rocio"
[1] "Rocio" "Rocio" "Violeta"
# 1. Calcula el minimo valor de 100 valores aleatorios según una distribución normal
min (rnorm (100))[1] -2.846955
# 2. Dada una secuencia de 20 números seguidos (del 0 al 20), genera los pares y guárdalo en un objeto.
pares <- seq (0, 20, 2)
# 3. Ejercicio:
# Crea un vector con 20 números aleatorios entre 0 y 50.
# Calcula el promedio y la desviación estándar.
# Multiplica todos los valores por 2.
# Dibuja un histograma.
#¿Cómo cambia el promedio después de multiplicar por 2?
mi_vector <- runif(20,0,50)
mean (mi_vector)[1] 30.40114
[1] 14.64594
# Crea un vector con edades y usa una comparación para saber cuáles son mayores de edad y cualcula cuantos no lo son
edades <- c(12, 18, 3, 44, 25, 15, 30)
sum (edades > 18)[1] 3
# Queremos la media de nuestros números transformados a logaritmo
vector <- seq(1, 100, 10)
mean (log (vector))[1] 3.380067
[1] 1.355705
[1] 4.065497
[1] 2.069674
log_vect <- function (y) {
mean_y <- mean (log (y+1))
sd_y <- sd (log (y+1))
print(paste("La media es", mean_y, ", la desviación estándar es:", round(sd_y,2)))
return(log(y))
}
vector3 <- seq(1, 300, 4)
distribution = log_vect (vector3)[1] "La media es 4.70839604852934 , la desviación estándar es: 0.98"
R repite algo automáticamente sin que lo escribas varias veces.
[paste(“Aquí está el número”, 1)
paste(“Aquí está el número”, 2)
paste(“Aquí está el número”, 3)
paste(“Aquí está el número”, 4)
paste(“Aquí está el número”, 5)] {style=“font-size: 0.2em !important;”}
[1] 5
[1] "Aquí está el número 1"
[1] "Aquí está el número 2"
[1] "Aquí está el número 3"
[1] "Aquí está el número 4"
[1] "Aquí está el número 5"
# i puede ser un caracter
nombres <- c ("Laura", "Rocio", "Violeta")
length(nombres) #número de iteraciones [1] 3
[1] "Aquí está la alumna Laura"
[1] "Aquí está la alumna Rocio"
[1] "Aquí está la alumna Violeta"
Con un dado ahora
[1] 5
# i puede ser solo el numero de veces que repetimos algo
resultados <- c()
for (i in 1:100) {
tiro <- sample(1:6, 1)
resultados <- c(resultados, tiro)
}
resultados [1] 5 2 3 2 4 1 1 4 5 1 2 2 4 5 3 4 5 6 3 1 5 5 1 3 6 3 1 4 1 1 6 4 4 2 1 1 4
[38] 6 6 6 6 1 2 4 4 1 1 4 1 5 3 3 4 5 2 3 4 3 3 5 6 5 1 6 5 6 2 4 6 2 6 5 6 1
[75] 3 6 6 2 6 4 4 5 3 6 1 5 6 4 5 6 1 6 2 6 5 6 2 2 2 5
[1] 3.67
[1] 14
# Queremos repetir el cálculo de media y desviación logarítmica
# para varios vectores distintos
vectores <- list(
seq(1, 100, 10),
seq(1, 300, 50),
seq(1, 500, 100)
)
# Creamos un bucle FOR
for (i in vectores) {
media <- mean(log(i + 1))
desv <- sd(log(i + 1))
print(paste("Media:", round(media, 2), " | Desviación:", round(desv, 2)))
}[1] "Media: 3.48 | Desviación: 1.16"
[1] "Media: 4.19 | Desviación: 1.8"
[1] "Media: 4.47 | Desviación: 2.17"
# Ahora queremos guardar los resultados
# Crear un vector vacío
resultados <- c()
for (i in vectores) {
media <- mean(log(i + 1))
desv <- sd(log(i + 1))
filas <- data.frame(media=media, desv=desv)
resultados <- rbind(resultados, filas)
}
resultados media desv
1 3.475605 1.164002
2 4.188490 1.800784
3 4.466653 2.171404
Otra forma de hacer bucles, pero en la misma linea
Condicionantes
if: R ejecuta el código dentro del bloque {} solo si la condición es verdadera.
if // else: si no se cumple la condición, haz esto otro
ifelse: lo mismo pero en una sola linea
Haz una función que me diga si un número cualquiera es par o no
Crea un vector con 10 temperaturas y usa ifelse() para clasificar cada valor como “Frío” o “Caluroso”
que_tipo_de_numero_soy <- function (x) {
ifelse(x %% 2 == 0, "par", "impar")
}
temperaturas <- rpois (10, 15)
clasificacion <- ifelse(temperaturas < 15, "frio", "caliente")
# Añade a una tabla esta clasificación
data.frame (temperaturas, clasificacion) temperaturas clasificacion
1 7 frio
2 18 caliente
3 15 caliente
4 15 caliente
5 14 frio
6 12 frio
7 12 frio
8 10 frio
9 14 frio
10 20 caliente
Una base de datos (data frame) es una tabla de datos, como una hoja de cálculo en excel, tiene filas (observaciones) y columnas (variables).
# Creamos vectores con información
nombres <- c ("Laura", "Rocio", "Violeta")
edad <- c(23, 35, 29)
altura <- c(1.65, 1.80, 1.70)
profesion <- c("Bióloga", "Profesora", "Médica")
# Combinamos todo en un data frame
personas <- data.frame(
NAME = nombres,
AGE = edad,
HEIGHT = altura,
JOB = profesion)
personas[1,] NAME AGE HEIGHT JOB
1 Laura 23 1.65 Bióloga
[1] "Laura" "Rocio" "Violeta"
[1] "Laura" "Rocio" "Violeta"
tabla vista en R (View)
En la práctica, los datos vienen archivos externos:CSV, Excel, TXT, o bases de datos online. El formato .csv (comma separated values) es el más común. Cada columna está separada por una coma o punto y coma.
NAME AGE HEIGHT JOB
1 Laura 23 1.65 Bióloga
2 Rocio 35 1.80 Profesora
3 Violeta 29 1.70 Médica
# EXCEL
library(readxl)
datos_excel <- read_excel(here("data/herbarium_df.xlsx")) #, sheet = 1 podríamos especificar el numero de hoja
head(datos_excel)# A tibble: 6 × 19
ID Collector Collection_number Assistants Family Taxon Author det
<dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 Hermione Granger 2.0 Sprout, P.… SOLAN… Mand… L. Spro…
2 2 Ron Weasley 5.0 Potter, H. SALIC… Sali… Huff. Spro…
3 3 Dobby H.E. 1.0 Winky H.E. Zoste… Zost… (Huff… Long…
4 4 Pomona Sprout 1990-301a Dumbledore… Suffo… Luci… Slyth. Spro…
5 5 Luna Lovegood 5.0 Xenophiliu… rosac… Prun… Rav. Love…
6 6 Algie Longbottom 3.0 Longbottom… Mimbu… Mimb… Spore Spro…
# ℹ 11 more variables: Det_date <chr>, life_form <chr>, Observations <chr>,
# Height <chr>, Location <chr>, Area_description <chr>, Elevation <chr>,
# Date <chr>, Latitude <chr>, Longitude <chr>, QR_code <chr>
# GOOGLE SHEETS
library(googlesheets4)
datos_gs <- read_sheet("https://docs.google.com/spreadsheets/d/1qC4lsXPpEcX1NmLdwiMJMC8X_WKX-EFQm4ahPdrNCZc/edit?usp=sharing")
head(datos_gs)# A tibble: 4 × 5
Nombre Fecha Titulo Tipo.comm Afiliacion
<chr> <dttm> <chr> <chr> <chr>
1 Severus Snape 1993-01-01 00:00:00 Pociones avanzada… oral Slytherin
2 Minerva McGonagall 1994-01-01 00:00:00 De gato a humano:… poster Gryffindor
3 Alastor Moody 1995-01-01 00:00:00 Distinguir entre … oral Gryffindor
4 Rubeus Hagrid 1996-01-01 00:00:00 ¿Por qué no vuela… oral Gryffindor
Base de datos de flores: Por cada sitio y pantrap, tenemos el numero de flores que tienen las especies de plantas en Doñana. Ejercicio: Importa la base de datos “flores.csv” de la carpeta “data”, explora la base de datos, calcula la abundancia media de flores total, indica cuantas especies distintas hay de plantas.
'data.frame': 490 obs. of 5 variables:
$ code : int 1 2 3 4 5 6 7 8 9 10 ...
$ site_id : chr "ANZ_1" "ANZ_1" "ANZ_1" "ANZ_1" ...
$ pantrap : int 1 1 1 2 2 2 2 3 3 4 ...
$ species : chr "Oxalis pes-caprae" "Cistus salvifolius" "Ornithogalum umbellatum" "Cistus salvifolius" ...
$ abundance: int 3 16 4 2 3 4 1 3 1 8 ...
[1] 16.45102
[1] 74
cookbook :::::